# -*- coding: UTF-8 -*-
# Project : zhaobiao
# File : businessname.py
# IDE : PyCharm
# Author : 博科（鑫贝西）田聪
# Date : 2021/11/17 8:30
# 提取企业名称
import re
from tools import loading
import jieba.posseg


# ns前缀 nt前缀 nrt前缀

# 有一总可能，是多个开头标记，这种归到一个里,取第一个
def list_set(ens):
    enss = []
    for en in ens:
        for k, v in enumerate(en):
            if len(v) != 1:
                if en.count(v) > 1:
                    en[k] = ''

        enss.append(''.join(en))
    return list(set(enss))

# 交集
def listjulist(yuan:list,find:list):
    """
    判断两个列表中是否有交集
    :return:有交集返回True，没有交集返回False
    """
    if set(yuan).intersection(set(find)):
        return True
    else:
        return False

def regfind(string:str,regexp:str):
    """
    判断是否存在
    """
    if re.findall(regexp, string) and 'lese' not in ''.join(re.findall(regexp, string)):
        return True
    else:
        return False

def extract(string: str):

    # 不能拆分数字
    if type(string) == int:
        return []
    string = re.sub(',','',string)
    en_names = [] # 企业名称列表
    en_name_lcut = jieba.posseg.lcut(string)
    en_name_lflag = [i.flag for i in en_name_lcut] #
    en_name = []  # 存放正常企业名称
    en_flag = []  # 存放企业开头和结尾标签
    for en_name_index,en_name_cut in enumerate(en_name_lcut):


        en_name_word = en_name_cut.word # 当前文本
        en_name_flag = en_name_cut.flag # 当前标签

        # 判断开否是否为正常企业开头
        if en_name_flag in ['sts','ns','nrt','nt']:
            # 获取到开头
            # if len(en_flag)>=5 and en_flag.count('ns') == 1 and not listjulist(en_flag,['sts','nrt','nt'])  and not listjulist(en_flag,['ed','wed','zed']):
            #     en_name = []
            #     en_flag = []
            en_name.append(en_name_word) # 存入en_name 之中，主要作用用之后进行判断
            en_flag.append(en_name_flag) # 存入en_flag 之中，主要作用用之后进行判断
            continue

        # 判断是否已经去到了企业开头
        if len(en_name)!=0:

            # 判断是否为内容正文
            if en_name_flag not in ['zed','ed','wed']:
                en_name.append(en_name_word)

            en_flag.append(en_name_flag)

            # 如果 en_name 企业数据中存在垃圾数据，而且还没有取到结尾，直接清除已经存入的企业名称
            # 存在垃圾数据，且取到了结尾，将结尾以前的设定为一个正常企业名称
            if en_name_flag == 'lese':

                # 判断之前的企业字段中有无结尾
                # 无结尾 清空
                if not listjulist(en_flag, ['zed', 'ed', 'wed']):
                    en_name = []
                    en_flag = []
                    continue

                # 存在交集
                # 有结尾
                else:
                    # 取到最后一个后缀 保存
                    for k,v in sorted(enumerate(en_name,-1),reverse=True):
                        if en_flag[k] in ['zed', 'ed', 'wed']:
                            en_names.append(en_name[:k])
                            en_name = []
                            en_flag = []
                            continue

            """
            ↑处理企业名称开头和中间内容
            
            ↓处理企业结尾和附属等
            """
            # 判断当前标签是不是结尾
            if en_name_flag in ['ed', 'wed', 'zed']:
                # zed:起始结尾
                # ed:中间结尾
                # wed:必定结尾

                # 剩余标签列表
                # 有限公司、中冠工程管理咨询有限公司(联合体)
                # ['ed', 'x', 'sts', 'n', 'vn', 'vn', 'ed', 'x', 'and', 'x']
                remain_list = en_name_lflag[en_name_index:]
                remain_lcut = en_name_lcut[en_name_index:]
                # 如果ed后面一个为sts，则是新的公司名称开头， 直接结束en name
                if len(remain_list) >1 and (remain_list[1] == 'sts' or en_name_flag == 'wed'):
                    en_name.append(en_name_word)
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []
                    continue
                # 最后一位是企业结尾
                elif len(remain_list) == 1 and en_name_flag in ['ed','wed','zed']:
                    en_name.append(en_name_word)
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []
                    continue

                remain_join = ''.join(remain_list)
                """
                wed之前 必定有ed或zed，不能单独存在
                zed 和 ed 可以单独存在
                当zed和ed同时存在时，ed必定在zed后面
                当ed 在zed 之前时这是复数个企业名
                """
                # zed ed wed
                # 这种可能是一个企业名称
                # 山东大学特殊医院附属医院

                if regfind(remain_join,'zed(.+?)ed(.+)wed'):
                    en_name.append(en_name_word)
                    en_flag.append(en_name_flag)

                elif regfind(remain_join,'zededwed'):
                    en_name.append(en_name_word)
                    en_name.append(en_name_lcut[en_name_index+1].word)
                    en_name.append(en_name_lcut[en_name_index+2].word)
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []

                # ed wed
                elif regfind(remain_join,'ed(.+)wed'):
                    en_name.append(en_name_word)
                    en_flag.append(en_name_flag)



                # edwed
                elif regfind(remain_join,'edwed'):
                    en_name.append(en_name_word)
                    en_name.append(en_name_lcut[en_name_index+1].word)
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []

                # zed wed
                elif regfind(remain_join,'zed(.+)wed'):
                    en_name.append(en_name_word)
                    en_flag.append(en_name_flag)

                elif regfind(remain_join,'zedwed'):
                    en_name.append(en_name_word)
                    en_name.append(en_name_lcut[en_name_index+1].word)
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []

                # zed zed
                elif regfind(remain_join,'zed(.+)zed'):
                    en_name.append(en_name_word)
                    next_ed_text = remain_lcut[remain_list.index('zed',1)].word
                    if next_ed_text == en_name_word:
                        en_names.append(en_name)
                        en_name = []
                        en_flag = []
                        continue

                elif regfind(remain_join,'zedzed'):
                    en_name.append(en_name_word)
                    en_name.append(en_name_lcut[en_name_index+1].word)
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []

                elif regfind(remain_join,'zedzedzed'):
                    en_name.append(en_name_word)
                    en_name.append(en_name_lcut[en_name_index+1].word)
                    en_name.append(en_name_lcut[en_name_index+2].word)
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []
                # zed ed
                elif regfind(remain_join, 'zed(.+)ed'):
                    en_name.append(en_name_word)
                    en_flag.append(en_name_flag)

                # zeded
                elif regfind(remain_join, 'zeded'):
                    en_name.append(en_name_word)
                    en_name.append(en_name_lcut[en_name_index + 1].word)
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []
                # ed ed
                elif regfind(remain_join, 'ed([a-z]{2,4})ed'):

                    en_name.append(en_name_word)
                    next_ed_text = remain_lcut[remain_list.index('ed',1)].word
                    if next_ed_text == en_name_word:
                        en_names.append(en_name)
                        en_name = []
                        en_flag = []
                        continue

                    en_name.append(en_name_lcut[en_name_index + 1].word)
                    for i in en_name_lcut[en_name_index+1:]:
                        en_name.append(i.word)
                        if i.flag == 'ed':
                            break
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []
                else:
                    en_name.append(en_name_word)
                    en_names.append(en_name)
                    en_name = []
                    en_flag = []
                # 这两个都没有
                # ed ed
                # wed wed

    return list_set(en_names)









if __name__ == '__main__':
    # for i in ['四川祈胜科技有限公司,四川德裕昌贸易有限公司', 0, 0]:
    # 黑龙江大学 测试
    # 四川省重点实验室专用设备:绵阳中信科瑞科技有限公司
    # 华东医药股份有限公司器材化剂分公司
    # 河北省金准医院管理有限公司
    # ['河北省金准医院']
    # 通辽光远电力安装有限责任公司科左后旗分公司
    # 南京东南大学城市规划设计研究院有限公司
    # ['城市规划设计研究院', '南京东南大学']
    # 中国环境科学研究院环境技术工程有限公司
    # ['中国环境科学研究院', '技术工程有限公司']
    # 理有限公司
    # 湖南省长沙市芙蓉区韶山路十七号幢湖南尊华医疗科技有限公司
    # 南宁市白沙大道号松宇时代楼广西国力招标有限公司
    print(extract('国药控股吉林省医疗器械有限公司'))
    # print(extract('优质食用菌生产基地建设项目二次汤阴县众诚电子有限公司'))
